package org.diy.redisson.annotation;

import org.diy.redisson.enums.IdempotentStrategy;
import org.diy.redisson.enums.ResultEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 幂等注解
 * @author tmz
 * @date 2021/7/14
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
    /**
     * 无参数可做区分标识
     * @return
     */
    String value() default "";

    /**
     * 方法描述
     * @return
     */
    String desc() default "";
    /**
     * 时间单位
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    long time() default 10L;
    /**
     * key值前缀 pre
     * @return
     */
    String pre() default "";

    /**
     * 幂等策略 {@link IdempotentField}
     * @return
     */
    IdempotentStrategy strategy() default IdempotentStrategy.LIST_PARAMETER;
    /**
     * 默认返回值
     * @author tmz
     * @date 2021/7/19
     */
    ResultEnum defaultReturn() default ResultEnum.SUCCESS;

    Class<? extends Throwable>[] unlockForErr() default {Exception.class};
}
